home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-04-27 | 2.2 KB | 83 lines | [TEXT/????] |
- ;;; $Header: vector.scm,v 1.2 87/08/28 02:13:41 GMT gjs Exp $
- ;;;; Vector Package
-
- (if-mit
- (declare (usual-integrations = + - * /
- zero? 1+ -1+
- ;; truncate round floor ceiling
- sqrt exp log sin cos)))
-
- ;;; This file uses the identification of the Scheme VECTOR data
- ;;; type with mathematical n-dimensional vectors.
- ;;; Thus we inherit the constructors VECTOR and MAKE-VECTOR,
- ;;; the selector VECTOR-REF and the mutator VECTOR-SET!, and
- ;;; zero-based indexing
-
- (define (generate-vector size proc)
- (let ((ans (make-vector size)))
- (let loop ((i 0))
- (if (= i size)
- ans
- (begin (vector-set! ans i (proc i))
- (loop (+ i 1)))))))
-
- (define ((vector-elementwise f) . vectors)
- (generate-vector
- (vector-length (car vectors))
- (lambda (i)
- (apply f (map (lambda (v) (vector-ref v i))
- vectors)))))
-
- (define add-vectors (vector-elementwise +))
-
- (define sub-vectors (vector-elementwise -))
-
- (define (scale-vector s)
- (lambda (v)
- (generate-vector (vector-length v)
- (lambda (i) (* s (vector-ref v i))))))
-
- (define (scalar*vector s v)
- (generate-vector (vector-length v)
- (lambda (i) (* s (vector-ref v i)))))
-
- (define (maxnorm v)
- (apply max (map abs (vector->list v))))
-
- (define (vector-accumulate acc fun init v)
- (let ((l (vector-length v)))
- (let loop ((i 0) (ans init))
- (if (= i l)
- ans
- (loop (1+ i)
- (acc (fun (vector-ref v i)) ans))))))
-
- (define (general-inner-product addition multiplication)
- (lambda (v1 v2)
- (let ((n (vector-length v1)))
- (if (not (= n (vector-length v2)))
- (error "Unequal dimensions -- INNER-PRODUCT" v1 v2))
- (let loop ((i 0) (ans 0))
- (if (= i n)
- ans
- (loop (+ i 1)
- (addition (multiplication (vector-ref v1 i)
- (vector-ref v2 i))
- ans)))))))
-
- (define dot-product
- (general-inner-product + *))
-
- (define inner-product
- (general-inner-product +
- (lambda (z1 z2)
- (* (conjugate z1) z2))))
-
- (define (euclidean-norm v)
- (sqrt (inner-product v v)))
-
- (define (unit-vector n i) ; #(0 0 ... 1 ... 0) n long, 1 in ith position
- (let ((v (make-vector n 0)))
- (vector-set! v i 1)
- v))
-